package cn.swanit.service.demo.service.impl;

/**
 * 需要鉴权的服务均需实现StpInterface接口
 *
 * @author chj
 * @date 2021年07月17日 17:01
 */

import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.session.SaSessionCustomUtil;
import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpUtil;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 自定义权限验证接口扩展,权限认证时回调
 */
@Slf4j
@Component  // 保证此类被SpringBoot扫描，完成Sa-Token的自定义权限验证扩展
public class StpInterfaceImpl implements StpInterface {

    /**
     * 返回一个账号所拥有的权限码集合
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        log.info("=====getPermissionList========={}", loginId);
        SaSession saSession = StpUtil.getSessionByLoginId(loginId);
        // 1. 获取这个账号所属角色id
        List<String> roleIds = saSession.get("Role_Id", () -> {
            return Arrays.asList("1", "2");     // 从数据库查询这个账号所属的角色id
        });
        List<String> permissions = new ArrayList<>();
        for (String roleId : roleIds) {
            permissions.addAll(SaSessionCustomUtil.getSessionById("role-" + roleId).get("Permission_List", () -> {
                return Arrays.asList("4", "5", "6");
            }));
        }
        log.info("===Permissions==={}", JSON.toJSONString(permissions));
        return permissions;
    }

    /**
     * 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        // 本list仅做模拟，实际项目中要根据具体业务逻辑来查询角色
        log.info("=====getRoleList========={}", loginId);
        List<String> list = new ArrayList<>();
        list.add("admin");
        list.add("super-admin");
        return list;
    }
}